<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8">
</head>
<body>

                    <h4>使用__future__</h4>
                    <div class="x-wiki-info"><span>1530次阅读</span></div>
                    <hr style="border-top-color:#ccc" />
                    <div class="x-wiki-content x-content"><p>Python的每个新版本都会增加一些新的功能，或者对原来的功能作一些改动。有些改动是不兼容旧版本的，也就是在当前版本运行正常的代码，到下一个版本运行就可能不正常了。</p>
<p>从Python 2.7到Python 3.x就有不兼容的一些改动，比如2.x里的字符串用<code>&#39;xxx&#39;</code>表示str，Unicode字符串用<code>u&#39;xxx&#39;</code>表示unicode，而在3.x中，所有字符串都被视为unicode，因此，写<code>u&#39;xxx&#39;</code>和<code>&#39;xxx&#39;</code>是完全一致的，而在2.x中以<code>&#39;xxx&#39;</code>表示的str就必须写成<code>b&#39;xxx&#39;</code>，以此表示“二进制字符串”。</p>
<p>要直接把代码升级到3.x是比较冒进的，因为有大量的改动需要测试。相反，可以在2.7版本中先在一部分代码中测试一些3.x的特性，如果没有问题，再移植到3.x不迟。</p>
<p>Python提供了<code>__future__</code>模块，把下一个新版本的特性导入到当前版本，于是我们就可以在当前版本中测试一些新版本的特性。举例说明如下：</p>
<p>为了适应Python 3.x的新的字符串的表示方法，在2.7版本的代码中，可以通过<code>unicode_literals</code>来使用Python 3.x的新的语法：</p>
<pre><code># still running on Python 2.7

from __future__ import unicode_literals

print &#39;\&#39;xxx\&#39; is unicode?&#39;, isinstance(&#39;xxx&#39;, unicode)
print &#39;u\&#39;xxx\&#39; is unicode?&#39;, isinstance(u&#39;xxx&#39;, unicode)
print &#39;\&#39;xxx\&#39; is str?&#39;, isinstance(&#39;xxx&#39;, str)
print &#39;b\&#39;xxx\&#39; is str?&#39;, isinstance(b&#39;xxx&#39;, str)
</code></pre><p>注意到上面的代码仍然在Python 2.7下运行，但结果显示去掉前缀<code>u</code>的<code>&#39;a string&#39;</code>仍是一个unicode，而加上前缀<code>b</code>的<code>b&#39;a string&#39;</code>才变成了str：</p>
<pre><code>$ python task.py
&#39;xxx&#39; is unicode? True
u&#39;xxx&#39; is unicode? True
&#39;xxx&#39; is str? False
b&#39;xxx&#39; is str? True
</code></pre><p>类似的情况还有除法运算。在Python 2.x中，对于除法有两种情况，如果是整数相除，结果仍是整数，余数会被扔掉，这种除法叫“地板除”：</p>
<pre><code>&gt;&gt;&gt; 10 / 3
3
</code></pre><p>要做精确除法，必须把其中一个数变成浮点数：</p>
<pre><code>&gt;&gt;&gt; 10.0 / 3
3.3333333333333335
</code></pre><p>而在Python 3.x中，所有的除法都是精确除法，地板除用<code>//</code>表示：</p>
<pre><code>$ python3
Python 3.3.2 (default, Jan 22 2014, 09:54:40) 
[GCC 4.2.1 Compatible Apple LLVM 5.0 (clang-500.2.79)] on darwin
Type &quot;help&quot;, &quot;copyright&quot;, &quot;credits&quot; or &quot;license&quot; for more information.
&gt;&gt;&gt; 10 / 3
3.3333333333333335
&gt;&gt;&gt; 10 // 3
3
</code></pre><p>如果你想在Python 2.7的代码中直接使用Python 3.x的除法，可以通过<code>__future__</code>模块的<code>division</code>实现：</p>
<pre><code>from __future__ import division

print &#39;10 / 3 =&#39;, 10 / 3
print &#39;10.0 / 3 =&#39;, 10.0 / 3
print &#39;10 // 3 =&#39;, 10 // 3
</code></pre><p>结果如下：</p>
<pre><code>10 / 3 = 3.33333333333
10.0 / 3 = 3.33333333333
10 // 3 = 3
</code></pre><h3 id="-">小结</h3>
<p>由于Python是由社区推动的开源并且免费的开发语言，不受商业公司控制，因此，Python的改进往往比较激进，不兼容的情况时有发生。Python为了确保你能顺利过渡到新版本，特别提供了<code>__future__</code>模块，让你在旧的版本中试验新版本的一些特性。</p>
</div>

                    <hr style="border-top-color:#ccc" />

                    